/* list.h -- 简单链表类型的头文件 */
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h> /* C99特性 */
/* 特定程序的声明 */
#define TSIZE 45 /* 储存电影名的数组大小 */
struct film
{
    char title[TSIZE];
    int rating;
};
/* 一般类型定义 */
typedef struct film Item;
typedef struct node
{
    Item item;
    struct node *next;
} Node;
typedef Node *List;

/* 函数原型 */
/* 操作： 初始化一个链表 */
/* 前提条件： plist指向一个链表 */
/* 后置条件： 链表初始化为空 */
void InitializeList(List *plist);

/* 操作： 确定链表是否为空定义，plist指向一个已初始化的链表 */
/* 后置条件： 如果链表为空，该函数返回true；否则返回false */
bool ListIsEmpty(const List *plist);

/* 操作： 确定链表是否已满，plist指向一个已初始化的链表 */
/* 后置条件： 如果链表已满，该函数返回真；否则返回假 */
bool ListIsFull(const List *plist);

/* 操作： 确定链表中的项数, plist指向一个已初始化的链表 */
/* 后置条件： 该函数返回链表中的项数 */
unsigned int ListItemCount(const List *plist);

/* 操作： 在链表的末尾添加项 */
/* 前提条件： item是一个待添加至链表的项, plist指向一个已初始化的链表 */
/* 后置条件： 如果可以，该函数在链表末尾添加一个项，且返回true；否则返回false */
bool AddItem(Item item, List *plist);

/* 操作： 把函数作用于链表中的每一项 */
/* plist指向一个已初始化的链表 */
/* pfun指向一个函数，该函数接受一个Item类型的参数，且无返回值 */
/* 后置条件： pfun指向的函数作用于链表中的每一项一次 */

void Traverse(const List *plist, void (*pfun)(Item item));

/* 操作： 释放已分配的内存（如果有的话） */
/* plist指向一个已初始化的链表 */
/* 后置条件： 释放了为链表分配的所有内存，链表设置为空 */
void EmptyTheList(List *plist);
#endif